package com.dynamicthreadpool.strategy;

import com.dynamicthreadpool.spi.URL;
import com.dynamicthreadpool.spi.ExtensionLoader;
import java.util.concurrent.BlockingQueue;

/**
 * 队列策略工厂，负责根据SPI机制创建不同类型的可调整大小的阻塞队列
 * 支持通过SPI机制扩展多种队列实现
 */
public final class QueueStrategyFactory {
    
    private static final ExtensionLoader<QueueStrategy> EXTENSION_LOADER = ExtensionLoader.getExtensionLoader(QueueStrategy.class);
    
    /**
     * 获取队列策略实例
     * @param url 包含队列配置的URL对象
     * @return 队列策略实例
     */
    public static QueueStrategy getStrategy(URL url) {
        if (url == null) {
            return EXTENSION_LOADER.getDefaultExtension();
        }
        String queueType = url.getParameter("queueType", (String)null);
        if (queueType == null) {
            return EXTENSION_LOADER.getDefaultExtension();
        }
        return EXTENSION_LOADER.getExtension(queueType);
    }
    
    /**
     * 创建队列
     * @param capacity 队列容量
     * @return 可调整大小的阻塞队列实例
     */
    public static BlockingQueue<Runnable> createQueue(int capacity) {
        return createQueue(null, capacity);
    }
    
    /**
     * 创建队列
     * @param url 包含队列配置的URL对象
     * @param capacity 队列容量
     * @return 可调整大小的阻塞队列实例
     */
    public static BlockingQueue<Runnable> createQueue(URL url, int capacity) {
        QueueStrategy strategy = getStrategy(url);
        return strategy.createQueue(capacity > 0 ? capacity : 100);
    }
}
